package com.example.ccj.u;

import java.io.File;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

public class SubclassFinder {

    /**
     * 查找该类的子类
     * @param parentClass
     * @return
     */
    public static List<Class<?>> findSubclasses(Class<?> parentClass) {
        List<Class<?>> subclasses = new ArrayList<>();
        String packageName = null;



        try {
            // 获取包含父类的包名
            if (parentClass.getPackage() != null) {
                packageName = parentClass.getPackage().getName();
            }
            if (packageName == null) return null;

            // 获取所有的类路径
            URL resource = ClassLoader.getSystemClassLoader().getResource(packageName.replace('.', '/'));
            if (resource != null) {
                File dir = new File(resource.getFile());
                for (File file : dir.listFiles()) {
                    if (file.getName().endsWith(".class")) {
                        String className = packageName + '.' + file.getName().substring(0, file.getName().length() - 6);
                        Class<?> clazz = Class.forName(className);
                        if (parentClass.isAssignableFrom(clazz) && !parentClass.equals(clazz)) {
                            subclasses.add(clazz);
                        }
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return subclasses;
    }
}
